---
title: AOF日志
description: Redis如何避免数据丢失？
---
Redis 作为缓存是一个非常普遍的适用场景。但是，一旦服务器宕机，内存中的数据将全部丢失。

目前，Redis 的持久化有两大机制，即 AOF（Append Only File）日志和 RDB 快照。

## AOF 日志的实现
:::tip 数据库的写前日志
Write Ahead Log，WAL ，在实际写数据前，先把修改的数据记到日志文件中，以便故障时进行恢复。
:::

AOF 日志是写后日志，Redis 会先执行命令，把数据写入内存，然后才记录日志，如下图所示：

![407f2686083afc37351cfd9107319a1f](https://img.wkq.pub/pic/407f2686083afc37351cfd9107319a1f.webp)

传统数据库的日志，例如 redo log (重做日志)，记录的是修改后的数据，而 AOF 里记录的是 Redis  收到的每一条命令，这些命令是以文本的形式存在的。

:::note

这里以 Redis 收到 `set testkey testvalue` 命令后记录的日志为例，看看 AOF 日志的内容。其中 `*3` 表示当前命令有 3 个部分，每部分都是由 `$+数字` 开头,后面紧跟具体的命令、键或值。数字表示这部分的命令、键或值一共有多少字节。

![4d120bee623642e75fdf1c0700623a9f](https://img.wkq.pub/pic/4d120bee623642e75fdf1c0700623a9f.webp)

:::

为了避免额外的开销， Redis 在 AOF 里面记录日志的时候，并不会先去对这些命令进行语法校验。所以，先记录日志再执行命令的话，日志中就可能有错误的命令，Redis 在使用日志恢复记录时，就可能出错。



而后写日志这种方式，就可以先让系统执行命令，只有命令能执行成功，才会记录到日志中，否则，就直接向客户端报错。所以，Redis使用后写 日志这一方式的一大好处时，可以避免出现记录错误命令的情况。



并且，它实在命令执行后才记录日志，所以不会阻塞当前的写操作。



AOF 也有两个潜在风险。

首先，如果刚执行完一个命令，还没有来得及记日志就宕机了，那么这个命令和相应的数据就会有丢失的风险。

其次，AOF 虽然避免了对当前命令的阻塞，但可能会给下一个操作带来阻塞风险。这是因为 AOF 日志也是在主线程中执行的，，如果把日志文件写入磁盘是，磁盘压力大，就会导致写盘很慢。

## 三种回写策略

